% -------------------------------- КОНТРОЛЛЕР ШИНЫ ISA ------------------------------- %
% --------------------- Листинг конфигурации " БЛОКА УПРАВЛЕНИЯ " -------------------- %

TITLE "l_m_isa8";

SUBDESIGN log_isa8
(
% ------------------- Интерфейс сигнального процессора TMS320C51PQ ------------------- %
% СШД : системная шина данных -------------------------------------------------------- %
 tms_db[8..0]		: BIDIR;
% СШД : системная адресная шина ------------------------------------------------------ %
 d_a[2..0]		: INPUT;
% СШУ : системная шина управления ---------------------------------------------------- %
 tms_br			: INPUT;
 tms_ds			: INPUT;
 lfb_f1_i2		: INPUT;
 tms_is			: INPUT;
 lfb_f1_i1		: INPUT;
 tms_rd			: INPUT;
 tms_we			: INPUT;
 tms_rs			: INPUT;
 tms_tout		: INPUT;
 lfb_f5_i1		: INPUT;
 lfb_f2_o1		: OUTPUT;
 tms_int4		: OUTPUT;
% ---------------------- БУПП : блок управления памятью программ --------------------- %
% ШУПП : шина управления памятью программ -------------------------------------------- %
 lfb_f1_o1		: OUTPUT;
% ------------------ БУВПД : блок управления внешней памятью данных ------------------ %
% ШУВПД : шина управления ВПД на основе EDO DRAM ------------------------------------- %
 ras			: OUTPUT;
 cas			: OUTPUT;
 dwr[3..0]		: OUTPUT;
 drd[3..0]		: OUTPUT;
% --------- БУВУОН : блок управления внешними устройствами общего назначения --------- %
% ШУВУОН : шина управления внешними устройствами общего назначения ------------------- %
 lfb_f4_o1		: OUTPUT;
 lfb_f5_o1		: OUTPUT;
 lfb_f3_o1		: OUTPUT;
 po0_o[1..0]		: OUTPUT;
% ----------------------- БУИ : блок управления интерфейсом ISA ---------------------- %
% ШУИ : шина управления интерфейсом ISA ---------------------------------------------- %
 pi1_i			: INPUT;
 sa[7..0]		: INPUT;
 ior			: INPUT;
 iow			: INPUT;
 aen			: INPUT;
 io_cs16		: OUTPUT;
 r_33c			: OUTPUT;
 w_33c			: OUTPUT;
 d_o[2..0]		: OUTPUT;
 lfb_f3_i1		: INPUT;
 lfb_f2_i1		: INPUT;
% ----------------------------- АП : асинхронный приёмник ---------------------------- %
% Получение информации --------------------------------------------------------------- %
 uart_rxd		: INPUT;
)

VARIABLE
% ------------------ БУВПД : блок управления ВПД на основе EDO DRAM ------------------ %
 pi4[7..0]		: NODE;
 po4[7..0]		: DFF;
 pi50			: NODE;
 po50			: DFF;
 e_w			: MACHINE WITH STATES (w0, w1, w2, w3, w4);
 c_w			: NODE;
 dwr[3..0]		: DFF;
% --------- БУВУОН : блок управления внешними устройствами общего назначения --------- %
 do[7..0], pi0[1..0]	: NODE;
 po0[1..0]		: DFF;
% ----------------------- БУИ : блок управления интерфейсом ISA ---------------------- %
 r_f, w_f, isa_int	: DFF;
 cs			: NODE;
 cs16			: TRI;
% ----------------------------- АП : асинхронный приёмник ---------------------------- %
 uart_int		: DFF;
 ur			: MACHINE WITH STATES (r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 );
 rn[7..0], rf, ri	: NODE;
 rb[7..0]		: DFF;
% -------------------------------- БК : блок контроля -------------------------------- %
 pii[8..0]			: TRI;

BEGIN
% ---------------------- БУПП : блок управления памятью программ --------------------- %
% -PRGMSS : сигнал выбора микросхем ПП ----------------------------------------------- %
 lfb_f1_o1	=  lfb_f1_i2 # lfb_f1_i1;
% ------------------ БУВПД : блок управления ВПД на основе EDO DRAM ------------------ %
% MAS : выбор номера страницы объёмом 512-строк х 512-столбцов х 16-бит -------------- %
 pi4[]		=  tms_db[7..0];
 po4[].d	=  pi4[];
 po4[].clk	=  tms_we # do4;
 po4[].clrn	=  tms_rs;
% WMS : выбор режима работы ---------------------------------------------------------- %
 pi50		=  tms_db0;
 po50.d		=  pi50;
 po50.clk	=  tms_we # do5;
 po50.clrn	=  tms_rs;
% -RASST : стробирование адреса строки в странице 512 x 512 x 16 --------------------- %
 e_w.clk	= !(!tms_br # tms_ds # tms_we);
 e_w.reset	= !tms_rs;
	TABLE
	e_w,	po50.q	  => e_w, ras, c_w;
	 w0,	   0	  =>  w1,  1,	1;
	 w0,	   1	  =>  w3,  1,	1;
	 w1,	   X	  =>  w2,  1,	0;
	 w2,	   X	  =>  w0,  0,	0;
	 w3,	   0	  =>  w0,  1,	1;
	 w3,	   1	  =>  w4,  0,	1;
	 w4,	   0	  =>  w0,  1,	1;
	 w4,	   1	  =>  w3,  0,	0;
	END TABLE;
% -CASST : стробирование адреса столбца в странице 512 x 512 x 16-бит ---------------- %
 cas		=  c_w & drd0 & drd1 & drd2 & drd3;
% -DWRST[3..0] : стробирование цикла записи в соответствующую м/с EDO DRAM ----------- %
 dwr[].d	=  po4[3..0].q;
 dwr[].clk	= !tms_br # tms_ds # tms_we;
 dwr[].prn	= !c_w;
% -DRDST[3..0] : стробирование цикла чтения в соответствующую м/с EDO DRAM ----------- %
 drd[]		= !tms_br # tms_ds # tms_rd # po4[7..4].q # !po50.q;
% --------- БУВУОН : блок управления внешними устройствами общего назначения --------- %
	TABLE
	d_a[2..0], tms_is =>   do[7..0];
	  B"000",     0	  => B"11111110";
	  B"001",     0	  => B"11111101";
	  B"010",     0	  => B"11111011";
	  B"011",     0	  => B"11110111";
	  B"100",     0	  => B"11101111";
	  B"101",     0	  => B"11011111";
	  B"110",     0	  => B"10111111";
	  B"111",     0	  => B"01111111";
	  B"XXX",     1	  => B"11111111";
	END TABLE;
% -EGMRDS : стробирование цикла чтения из глобальной памяти -------------------------- %
 lfb_f4_o1	=  tms_br # tms_rd;
% -EP6WRS : стробирование цикла записи в устройство ввода-вывода --------------------- %
 lfb_f5_o1	=  tms_we # do6;
% -EPRESO : выходной сигнал функции программного сброса ------------------------------ %
 lfb_f3_o1	=  tms_rs & lfb_f3_i1;
% FOP : порт вывода флага ------------------------------------------------------------ %
 pi0[]		=  tms_db[1..0];
 po0[].d	=  pi0[];
 po0[].clk	=  tms_we # do0;
 po0[].prn	=  tms_rs;
% EXFOUT : выходы внешних флагов ----------------------------------------------------- %
 po0_o[]	=  po0[].q;
% ----------------------- БУИ : блок управления интерфейсом ISA ---------------------- %
 r_f.d		=  VCC;
 r_f.clk	=  r_33c;
 r_f.clrn	=  tms_rs & d_o1;
 w_f.d		=  VCC;
 w_f.clk	=  w_33c;
 w_f.clrn	=  tms_rs & d_o2;
 isa_int.d	=  GND;
 isa_int.clk	=  r_33c & w_33c;
 isa_int.prn	=  (tms_rd # do1) & tms_rs;
% -I/OCS16 : подтверждение 16-и разрядного устройства шины ISA ----------------------- %
 cs		=  (sa[7..0] == H"CF");
 cs16.in	=  GND;
 cs16.oe	= !aen & cs;
 io_cs16	=  cs16.out;
% -RDSTR : стробирование цикла чтения из порта 33Ch шины ISA ------------------------- %
 r_33c		=  ior # aen # !cs;
% -WRSTR : стробирование цикла записи в порт 33Ch шины ISA --------------------------- %
 w_33c		=  iow # aen # !cs;
% -EP6RDS : стробирование цикла чтения из устройства ввода-вывода -------------------- %
 d_o0		=  tms_rd # do6;
% -EP7WRS : стробирование цикла записи в буферный регистр порта 33Ch ----------------- %
 d_o1		=  tms_we # do7;
% -EP7RDS : стробирование цикла чтения из буферного регистра порта 33Ch -------------- %
 d_o2		=  tms_rd # do7;
% ----------------------------- АП : асинхронный приёмник ---------------------------- %
 uart_int.d	=  ri;
 uart_int.clk	=  tms_tout;
 uart_int.prn	=  (tms_rd # do3) & tms_rs;
% ASPRXD : получение информации ------------------------------------------------------ %
 ur.clk		=  tms_tout;
 ur.reset	= !tms_rs;
	TABLE
	ur,	uart_rxd  => ur,   rn[7..0], rf, ri;
	r0,	    0	  => r2, B"00000000", 0,  1;
	r0,	    1	  => r0, B"00000000", 0,  1;
	r1,	    0	  => r2, B"00000000", 0,  1;
	r1,	    1	  => r1, B"00000000", 1,  1;
	r2,	    X	  => r3, B"00000001", 0,  1;
	r3,	    X	  => r4, B"00000010", 0,  1;
	r4,	    X	  => r5, B"00000100", 0,  1;
	r5,	    X	  => r6, B"00001000", 0,  1;
	r6,	    X	  => r7, B"00010000", 0,  1;
	r7,	    X	  => r8, B"00100000", 0,  1;
	r8,	    X	  => r9, B"01000000", 0,  1;
	r9,	    X	  => r1, B"10000000", 0,  0;
	END TABLE;
 rb[].d		=  uart_rxd;
 rb[].clk	= !rn[];
% -------------------------------- БК : блок контроля -------------------------------- %
% IBR , STRx , SHRR : регистры ------------------------------------------------------- %
 pii0.in	=  (pi1_i # do1) & (do3 # rb0);
 pii1.in	=  (do1 # r_f.q) & (do3 # rb1);
 pii2.in	=  (do1 # w_f.q) & (do3 # rb2);
 pii3.in	=  (do1 # rf) & (do3 # rb3);
 pii[7..4].in	=  do3 # rb[7..4];
 pii8.in	=  (GND # do1) & (lfb_f5_i1 # do2) & (VCC # do3);
 pii[].oe       =  tms_rd !# (do1 & do3);
 tms_db[]	=  pii[].out;
% -INTREQ1 : сигнал прерывания TMS320C51 #1 ------------------------------------------ %
 lfb_f2_o1	= !lfb_f2_i1;
% -INTREQ2 : сигнал прерывания TMS320C51 #4 ------------------------------------------ %
 tms_int4	=  isa_int & uart_int;
END;